/*
 * @Version: 1.0
 * @Author: ZPK
 * @Date: 2022-11-19 14:42:13
 * @LastEditors: ZPK
 * @LastEditTime: 2022-11-19 15:00:36
 */
// 泛型可以用于函数 对象  类。。。。

// 根据长度和内容 创建一个数组
const getArray = <T>(times:number,val:T):T[]=>{
    let result = []
    for(let i=0;i<times;i++){
        result.push(val)
    }
    return result
}
// getArray<number>(3,123)
getArray(3,123)
getArray(3,'ad')

// 多个泛型来使用 元祖交换

// function swap<T,U>(tuple:[T,U]):[U,T]{
//     return [tuple[1],tuple[0]]
// }
type ISwap = <T,U>(tuple:[T,U])=>[U,T]
interface IISwap{
    <T,U>(tuple:[T,U]):[U,T]
}
const swap = <T,U>(tuple:[T,U]):[U,T]=>{
    return [tuple[1],tuple[0]]
}
// const swap:ISwap=....
let re= swap(['js',30])



// 第一种：一个是使用接口的时候确定类型
type ICallback<T> = (item:T,index:number)=>void
type IForEach=<T>(arr:T[],callback:ICallback<T>)=>void
// 第二种：在调用函数的时候确定了类型
// type ICallback = <T>(item:T,index:number)=>void



const forEach = <T>(arr:T[],callback:ICallback<T>)=>{
    for(let i=0;i<arr.length;i++){
        callback(arr[i],i) //callback没有执行  所以无法推导arr[i] = T
    }
}
forEach([1,2,3],function(item){
    console.log(item);
    
})


export{}